//
//  JStatusCell.swift
//  JMicroBlog
//
//  Created by Jason on 22/5/15.
//  Copyright (c) 2015 Shepherd. All rights reserved.
//

import UIKit
import SDWebImage

// MARK: - 代理
protocol JStatusCellDelegate : NSObjectProtocol {
    // 具体选中哪张图片的
    func statusCellDidSelectedPicture(cell:JStatusCell,pictureCell:PictureCell,index:Int)
}

class JStatusCell: UITableViewCell {
    
    // MARK: 属性
    
    // 代理属性
    weak var pictureDelegate:JStatusCellDelegate?
    
    // 用户头像
    @IBOutlet weak var userIconView: UIImageView!
    // 用户名
    @IBOutlet weak var userNameLabel: UILabel!
    // 发布时间
    @IBOutlet weak var timeLabel: UILabel!
    // 发布来源
    @IBOutlet weak var sourceLabel: UILabel!
    // 微博内容
    @IBOutlet weak var contentLabel: UILabel!
    
    // 配图数组的高度
    @IBOutlet weak var picHeightCons: NSLayoutConstraint!
    
    // 配图数组的宽度
    @IBOutlet weak var picWidthCons: NSLayoutConstraint!
    
    // 布局
    @IBOutlet weak var picViewLayout: UICollectionViewFlowLayout!
    
    // collectionView
    @IBOutlet weak var collectionView: UICollectionView!
    
    // 底部视图 用于计算行高属性
    @IBOutlet weak var bottomView: UIView!
    
    // 转发微博文本
    @IBOutlet weak var forwardLabel: UILabel!
    ///  认证图标
    @IBOutlet weak var certIconView: UIImageView!
    /// 会员图标
    @IBOutlet weak var vipVIew: UIImageView!
    
    
    var status : JStatus? {
        didSet {
            userNameLabel.text = status?.user?.name
            timeLabel.text = status?.created_at
            sourceLabel.text = status?.source
            contentLabel.text = status?.text
            // 设置头像
            userIconView.sd_setImageWithURL(status?.user?.iconURL)
            // 计算配图大小
            let picSize = calPictureViewSize(status!)
            
            // 网速不给力的情况下 需要考虑的
            if picSize.itemSize == nil || picSize.viewSize == nil {
                return
            }
            // 设置认证图标
            certIconView.image = status?.user?.vipImage
            
            // 设置会员图标
            vipVIew.image = status?.user?.memberImage
            
            picWidthCons.constant = picSize.viewSize!.width
            picHeightCons.constant = picSize.viewSize!.height ?? 0
            
            // 设置layout的大小
            picViewLayout.itemSize = picSize.itemSize!
            
            // 让collectionView刷新数据
            collectionView.reloadData()
            
            // 判断是否是转发微博
            forwardLabel?.text = (status?.retweeted_status?.user?.name ?? "")+":"+(status?.retweeted_status?.text ?? "")
        }
    }
    
    /**
    根据是否存在转发微博属性,确定该返回哪个cell原型
    
    :param: status 微博数据
    
    :returns: 原型cell的字符串
    */
    class func cellReuseId(status:JStatus) -> String {
        // 如果是转发微博
        if status.retweeted_status != nil {
            return "JFollowCell"
        }
        return "JHomeCell"
    }
    
    // 根据微博数据计算行高
    func rowHeight(status:JStatus) -> CGFloat {
        // 1.设置weibo数据
        self.status = status
        
        // 2.强制刷新布局
        layoutIfNeeded()
        
        // 3.返回底部视图的最大高度
        return CGRectGetMaxY(bottomView.frame)
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // 此处的cell还没有被设置
        contentLabel.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
        forwardLabel?.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
    }

    /**
    计算图片大小
    1> 没有图片 CGRectZero
    2> 一张图片 图片比例
    3> 四张图片 2*2
    4> 大于4张  3*3
    网络过慢的情况下 图片尺寸为nil
    :param: status 微博
    :return: 图片尺寸
    */
    func calPictureViewSize(status:JStatus) -> (viewSize:CGSize?,itemSize:CGSize?) {
        // 单张图片的默认大小
        let s : CGFloat = 90
        let itemSize  = CGSize(width: s,height: s)
        // 图片间隔
        let m : CGFloat = 10
        // 图片数量
        let imgCount = status.pictureURL?.count ?? 0
        
        
        
        // 根据图片数量的不同返回不同的尺寸
        switch(imgCount) {
            // 这里如果没注意 就会报 Negative or zero not support in layout
        case 0: return (CGSizeZero,itemSize)
        case 1:
            // 利用SDWebImage从缓存加载图片 缓存图片的key为URL,不是图片名
            let key = status.pictureURL![0].absoluteString
            let img = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
            JLog.i("单张图片",false)
            return (img?.size,img?.size)
        case 4:
            JLog.i("四张图片",false)
            return (CGSizeMake(s * 2 + m, s * 2 + m),itemSize)
        default:
            let row = CGFloat((imgCount - 1) / 3 + 1) // 行数
            JLog.i("多张图片",false)
            return (CGSizeMake(s * 3 + m * 2, row * s + m * (row - 1)),itemSize)
        }
    }

}

// MARK: - UICollectionView的数据源方法
extension JStatusCell : UICollectionViewDataSource,UICollectionViewDelegate {
    
    // MARK: - UICollectionView的数据源方法
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return status?.pictureURL?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("JPictureCell", forIndexPath: indexPath) as! PictureCell
        // 设置cell
        cell.url = status!.pictureURL![indexPath.item]
        
        return cell
    }
    // MARK: - UICollectionView的代理方法
    
    /**
    选中某个cell触发的事件
    控制器需要
    1.选择照片的序号
    2.当前照片所在的cell
    
    :param: collectionView 哪个collectionView
    :param: indexPath      对应的索引
    */
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        // 获取当前用户选中的cell
        let pictureCell = collectionView.cellForItemAtIndexPath(indexPath) as! PictureCell
        // 在合适的时候调用代理的方法
        pictureDelegate?.statusCellDidSelectedPicture(self, pictureCell: pictureCell, index: indexPath.item)
    }
}

/***  微博配图的cell
*/
class PictureCell : UICollectionViewCell {
    
    @IBOutlet weak var imgView: UIImageView!
    
    var url : NSURL? {
        didSet {
            imgView.sd_setImageWithURL(url)
        }
    }
}
